{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example was adapted from skaae's Lasagne [recipe](https://github.com/skaae/Recipes/blob/spatial_transform/examples/spatial_transformer_network.ipynb).  \n",
    "You can download skaae's Cluttered MNIST dataset [here](https://s3.amazonaws.com/lasagne/recipes/datasets/mnist_cluttered_60x60_6distortions.npz).\n",
    "This ipython notebook was adapted from Seya's spatial transformer network example\n",
    "(https://github.com/EderSantana/seya/blob/keras1/examples/Spatial%20Transformer%20Networks.ipynb)\n",
    "\n",
    "Reference at [arXiv](http://arxiv.org/abs/1506.02025)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "np.random.seed(1337)  # for reproducibility\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.misc import imresize\n",
    "from keras.datasets import mnist\n",
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense, Dropout, Activation, Flatten\n",
    "from keras.layers.convolutional import Convolution2D, MaxPooling2D\n",
    "from keras.utils import np_utils\n",
    "from keras.utils import np_utils, generic_utils\n",
    "from keras.optimizers import Adam, SGD\n",
    "\n",
    "import keras.backend as K\n",
    "from spatial_transformer import SpatialTransformer\n",
    "\n",
    "batch_size = 128\n",
    "nb_classes = 10\n",
    "nb_epoch = 12\n",
    "\n",
    "DIM = 60\n",
    "mnist_cluttered = \"../datasets/mnist_cluttered_60x60_6distortions.npz\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train samples: (50000, 60, 60, 1)\n",
      "Validation samples: (10000, 60, 60, 1)\n",
      "Test samples: (10000, 60, 60, 1)\n",
      "Input shape: (60, 60, 1)\n"
     ]
    }
   ],
   "source": [
    "data = np.load(mnist_cluttered)\n",
    "X_train, y_train = data['x_train'], np.argmax(data['y_train'], axis=-1)\n",
    "X_valid, y_valid = data['x_valid'], np.argmax(data['y_valid'], axis=-1)\n",
    "X_test, y_test = data['x_test'], np.argmax(data['y_test'], axis=-1)\n",
    "# reshape for convolutions\n",
    "X_train = X_train.reshape((X_train.shape[0], DIM, DIM, 1))\n",
    "X_valid = X_valid.reshape((X_valid.shape[0], DIM, DIM, 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], DIM, DIM, 1))\n",
    "\n",
    "y_train = np_utils.to_categorical(y_train, nb_classes)\n",
    "y_valid = np_utils.to_categorical(y_valid, nb_classes)\n",
    "y_test = np_utils.to_categorical(y_test, nb_classes)\n",
    "\n",
    "print(\"Train samples: {}\".format(X_train.shape))\n",
    "print(\"Validation samples: {}\".format(X_valid.shape))\n",
    "print(\"Test samples: {}\".format(X_test.shape))\n",
    "\n",
    "\n",
    "input_shape =  np.squeeze(X_train.shape[1:])\n",
    "input_shape = (60,60,1)\n",
    "print(\"Input shape:\",input_shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb1008ea5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(7,7))\n",
    "plt.imshow(X_train[101].reshape(DIM, DIM), cmap='gray', interpolation='none')\n",
    "plt.title('Cluttered MNIST', fontsize=20)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# initial weights\n",
    "b = np.zeros((2, 3), dtype='float32')\n",
    "b[0, 0] = 1\n",
    "b[1, 1] = 1\n",
    "W = np.zeros((50, 6), dtype='float32')\n",
    "weights = [W, b.flatten()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "locnet = Sequential()\n",
    "locnet.add(MaxPooling2D(pool_size=(2,2), input_shape=input_shape))\n",
    "locnet.add(Convolution2D(20, (5, 5)))\n",
    "locnet.add(MaxPooling2D(pool_size=(2,2)))\n",
    "locnet.add(Convolution2D(20, (5, 5)))\n",
    "\n",
    "locnet.add(Flatten())\n",
    "locnet.add(Dense(50))\n",
    "locnet.add(Activation('relu'))\n",
    "locnet.add(Dense(6, weights=weights))\n",
    "#locnet.add(Activation('sigmoid'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "model = Sequential()\n",
    "\n",
    "model.add(SpatialTransformer(localization_net=locnet,\n",
    "                             output_size=(30,30), input_shape=input_shape))\n",
    "\n",
    "model.add(Convolution2D(32, (3, 3), padding='same'))\n",
    "model.add(Activation('relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "model.add(Convolution2D(32, (3, 3)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "\n",
    "model.add(Flatten())\n",
    "model.add(Dense(256))\n",
    "model.add(Activation('relu'))\n",
    "\n",
    "model.add(Dense(nb_classes))\n",
    "model.add(Activation('softmax'))\n",
    "\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "XX = model.input\n",
    "YY = model.layers[0].output\n",
    "F = K.function([XX], [YY])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "390.625\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape[0]/batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------\n",
      " 9920/10000 [============================>.] - ETA: 0sEpoch: 0 | Valid: 0.9852591394424438 | Test: 0.9854512462615966\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nIaTyEaYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb06c09a780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------\n",
      " 9888/10000 [============================>.] - ETA: 0sEpoch: 1 | Valid: 0.6036122110366822 | Test: 0.6040152457714081\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb0404342b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------\n",
      " 9792/10000 [============================>.] - ETA: 0sEpoch: 2 | Valid: 0.44735146727561953 | Test: 0.4418271632194519\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nhonzx0cJLbQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb03a1b1e80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------\n"
     ]
    }
   ],
   "source": [
    "nb_epochs = 10 # you probably want to go longer than this\n",
    "batch_size = 256\n",
    "fig = plt.figure()\n",
    "try:\n",
    "    for e in range(nb_epochs):\n",
    "        print('-'*40)\n",
    "        #progbar = generic_utils.Progbar(X_train.shape[0])\n",
    "        for b in range(150):\n",
    "            #print(b)\n",
    "            f = b * batch_size\n",
    "            l = (b+1) * batch_size\n",
    "            X_batch = X_train[f:l].astype('float32')\n",
    "            y_batch = y_train[f:l].astype('float32')\n",
    "            loss = model.train_on_batch(X_batch, y_batch)\n",
    "            #print(loss)\n",
    "            #progbar.add(X_batch.shape[0], values=[(\"train loss\", loss)])\n",
    "        scorev = model.evaluate(X_valid, y_valid, verbose=1)\n",
    "        scoret = model.evaluate(X_test, y_test, verbose=1)\n",
    "        print('Epoch: {0} | Valid: {1} | Test: {2}'.format(e, scorev, scoret))\n",
    "        \n",
    "        if e % 1 == 0:\n",
    "            Xresult = F([X_batch[:9]])\n",
    "            plt.clf()\n",
    "            for i in range(9):\n",
    "                plt.subplot(3, 3, i+1)\n",
    "                image = np.squeeze(Xresult[0][i])\n",
    "                plt.imshow(image, cmap='gray')\n",
    "                plt.axis('off')\n",
    "            fig.canvas.draw()\n",
    "            plt.show()\n",
    "        \n",
    "except KeyboardInterrupt:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualizing what the Spatial Transformer learned"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Xaug = X_train[:9]\n",
    "Xresult = F([Xaug.astype('float32')])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nXT2cY2nXrh2NHj2aAgMDhZ9bU9NEn+Nytrza0rp160bdunWjM2fO0KVLl2z+d2VlZWQ2m5VzbZZF\nty2tqaltnFdt8lq/+fj40K5du6xWsb916xatX7/eYd9GsmdedZGU/v37kyRJ9P777wvbodzZxHS2\npKQkSkpKIrPZ3KwiWlxcTNeuXaPc3FzKzc2lefPm0dmzZ62+Rsh5FZfXu1u7du1o6dKldP78edq4\ncaNNizff3c6dO0dms1nzvOoiKZYiWllZSefPn6e5c+fSiy++qFmCubOJ6Wx+fn6Un59P+fn5zS6i\n7du3b/DYnDlzlJHov//9b86roLw6qq1fv54kSdI8r7pIipeXF7399ttWw3177iytmuhO4Wx5vV+b\nO3eu1SH4qlWrVL1ehw4d6MKFC3YdrXBenaeNHj1ayEhUF1OcamtrsWDBAjz88MP4/PPPRYfDNGQw\nGJSWlZWl6rVKS0vRq1cveHry9VRXlJiYKOR9dfPXJEkSjh8/jvHjx4sOhWkkMjLSMiJCaWkpz6Bg\n92RZcU1rPE9UQ8TzCW0WFhaG3NxcpYj+9re/xdatW+39NnbBeRWPiJSVnjw8POz1mjblVReH88y9\neHp6Yv78+VaP5eXlCYqG2cvLL78MSZIabcXFxcjPz2/R6y5cuBCyLIOIcOnSJTtHfX+6OZxn7qNz\n586YOnWq6DCYnQ0YMABA3TWO7OxsAMB7770HANi1axeKioqa/ZqLFy/GCy+8AKDu203Lli2zU7S2\n4yLKnM7w4cNhMBhgNBqxZcsWAMChQ4cER8XspaqqCrNmzQIA/PDDD6pea9GiRVi0aJE9wmoxLqLM\n6YwbN045x3Xs2DHR4TA7GTFiBIC6tXxbMup0VnxOlDHGVOCRKHMqfn5+CAwMBABcu3YN69evFxwR\ns5cHHngAAFBUVIROnToBgPJfC8u5Uj3hKU4a4qkw9xcdHY19+/YBAFauXIl58+bZ66UdhvNqG0mS\n7ruNvaYn2QNPcWK6FB8fLzoExpqFR6Ia4hHL/R04cEBZT9KZRiX3wnm1zdKlS9G/f3+rxzZv3owL\nFy5g9erViIyMdKqc25pXLqIa4s52b926dcOePXvQq1cvHD16FIMGDbLHyzoc59U18eG8g/Xr1w+y\nLOPEiRMNTo6zlpk4cSJ69eqFmpoaLF++3Oq5oKAg5VspPXv2dFgMlpV50tPTHfYezLXw1XkViAh9\n+/bFa6+9huTkZNHh6N7MmTMBAMXFxcoke4uXXnpJKXBz585FWVmZ8tzChQvtHktsbCxiY2ORkZFh\n99dmLobXJ2xZW7JkibKu6YwZM+y6PqHeWkv34d23q65v3bp1BIDmzZtH8+bNo8rKygbryTpiXVmT\nyaTEYDKZOK9u3GzdTzwSbYGgoCC88sorAOq+fZGSkiI4In2Ki4tDYWEhnnzySfTu3RuTJk2Cl5cX\nACh3XF26dKmmMQ0fPlzT92P6x0W0BWbNmoWAgAAAwDvvvINbt24Jjkifvv76awDA0aNHAQA//fQT\nZs6ciSNHjuCdd94RElNsbKyQ92X6xUW0BTp27AiDoe7C3d69ewVH4zomTZoEg8GA48ePo7q6usnt\nJElCRUWFQ2P585//DJPJ5ND3YC6Cz7E43zkWvTV77Z/y8nKSZZnmzp1LwcHB9NNPP2l+Ty0i28+F\ncl5du9m6n3gkyoRr1aoVXn75Zfj7+6OmpgapqakwGo1o1aqV5rHwCJQ1F0+2v0vPnj1x5swZAFAu\nctgL8aTsRg0ePBjfffcdAODjjz/GpEmTEBISgoKCAqvtnOnbLPVxXl2TrXnlyfaNMBqNMBqb3jV9\n+/bFypUrkZ2dDUmSYDablbZ582YNI3U9X375JQDg97//veBIGLMNF1HGGFOBz4ne5caNG9i2bRue\nfvrpRp8n+v93FQTqRq2yLCv3ipk+fbomcbqSQ4cOwWg0wsPDAx07dkRISAiCgoJEh8WYTbiI3qWi\nogLTp0/HnTt3Gn3e8v3tqqoqZGZmYt++fdi2bRsKCws1jtS1JCUlITg4GK+99proUBhrFr6w1Ezn\nzp3D4sWLkZeXpywebCu+ANG02trae56HBvjCktZcob+qYWteuYhqiDtb0/S26nl9nFfXZGte+XCe\nOQVnLZCM3Q9fnWeMMRW4iDLGmAqanhNljDFXwyNRxhhTgYsoY4ypwEWUMcZU4CLKGGMqcBFljDEV\nuIgyxpgKXEQZY0wFLqKMMaYCF1HGGFOBiyhjjKnARZQxxlTgIsoYYypwEWWMMRW4iDLGmApcRBlj\nTAUuoowxpgIXUcYYU4GLKGOMqcBFlDHGVOAiyhhjKnARZYwxFbiIMsaYClxEGWNMhf8HtQgMr3PZ\nseoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb06ff96748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# input\n",
    "for i in range(9):\n",
    "    plt.subplot(3, 3, i+1)\n",
    "    plt.imshow(np.squeeze(Xaug[i]), cmap='gray')\n",
    "    plt.axis('off')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb03a289588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# output\n",
    "for i in range(9):\n",
    "    plt.subplot(3, 3, i+1)\n",
    "    plt.imshow(np.squeeze(Xresult[0][i]), cmap='gray')\n",
    "    plt.axis('off')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "keras2",
   "language": "python",
   "name": "keras2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
